import hashlib
from uuid import uuid4

def make_hashed_password(password):
    '''
    功能： 用户注册时，给用户的密码进行加密，
    :param password:  用户的字符串密码
    :param salt:  加密的使用的盐,可以是用户账户,也可以随机生成一个字符串
    :return:
    '''
    #使用uuid作为加密的盐值
    salt = str(uuid4())

    # 将盐值与密码组合,转成bytes类型
    salted_password = salt.encode() + password.encode()

    # 使用哈希函数进行加密,对组合进行加密
    hashed_password = hashlib.sha256(salted_password).hexdigest()

    #返回密码和随机生成的盐
    return hashed_password, salt

def check_str_password(salt:str,password_str:str,password_hashed:str)->bool:
    '''
    :param salt: 搜索用户表，中关于salt字段
    :param password_str: 前端传递过来的字符串密码
    :param password_hashed: 用户表中对应的加密过的用户的密码
    :return:  hash过后的密码，比较该密码与用户名中存的密码是否一致
    '''
    #讲盐值与密码组合
    salted_password = salt.encode()+password_str.encode()
    #hash后的密码
    hashed_password = hashlib.sha256(salted_password).hexdigest()
    #判断生成的密码,是否与数据库中存储的密码一致
    if hashed_password == password_hashed:
        return True
    else:
        return False


if __name__ == '__main__':
    '1 用户注册时,把用户的字符串密码进行加密,得到hash后的密码和加密使用的盐值'
    tuple_1 = make_hashed_password('123')
    print(tuple_1)
    #测试数据:('6562972bfb580eeaf5cfacfe011ec2cf8b2316c9833a89ad04d73a7c79241408', '9c8b4025-a76a-4365-931e-71faedcd427d')

    '2 用户登录时,将用户传递的字符串密码,进行相同的加密方式,比较是否与数据库中存的密码一样'
    salt = '9c8b4025-a76a-4365-931e-71faedcd427d'
    password_hashed = '6562972bfb580eeaf5cfacfe011ec2cf8b2316c9833a89ad04d73a7c79241408'
    password_is_true = check_str_password(
        salt=salt,
        password_str='123',
        password_hashed=password_hashed
    )
    if password_is_true:
        print('密码正确')
    else:
        print('密码错误')